#include "TcpServer.hpp"
#include "Http.hpp"

//登录服务：接收对方的请求对象，返回处理结果--响应对象
HttpResponse Login(HttpRequest &req)
{
    HttpResponse resp;
    std::cout << "外部已经拿到了参数了: "<< std::endl;
    req.GetRequestBody();//获取请求对象的正文
    std::cout << "####################### "<< std::endl;
    //设置响应对象的状态码，正文。。。，告诉对方处理的情况
    resp.AddCode(200, "OK");
    resp.AddBodyText("<html><h1>result done!</h1></html>");

    // username=helloworld&userpasswd=123456

    //连接业务---一般是其它语言更擅长;
    //父进程和子进程通过管道交流，把子进程的读写端重定向到管道，从管道读，把处理结果通过管道返回;
    // 1. pipe
    // 2. dup2 重定向
    // 3. fork();
    // 4. exec*（程序替换，外壳没变，内容变成其它语言编译的程序） -> python, PHP, 甚至是Java！

    return resp;
}

// ./tcpserver 8888
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " local-port" << std::endl;
        exit(0);
    }
    uint16_t port = std::stoi(argv[1]);

    HttpServer hserver;
    //在服务列表中插入服务路径和服务函数
    hserver.InsertService("/login", Login);
    // hserver.InsertService("/register", Login);
    // hserver.InsertService("/search", Login);

    //创建TcpServer对象，返回给unique_ptr(不可被拷贝版智能指针)
    //TcpServer对象的初始化：把HttpServer::HandlerHttpRequest成员函数通过bind包装+端口号
    std::unique_ptr<TcpServer> tsvr = std::make_unique<TcpServer>(
        std::bind(&HttpServer::HandlerHttpRequest, &hserver, std::placeholders::_1), 
        port
    );
    //server接收client连接+多线程长服务
    tsvr->Loop();

    return 0;
}